Skip to content

feat: CLI, devcontainer, and sandbox package#21

Merged
ryaneggz merged 177 commits intomainfrom
development
Apr 11, 2026
Merged

feat: CLI, devcontainer, and sandbox package#21
ryaneggz merged 177 commits intomainfrom
development

Conversation

@ryaneggz
Copy link
Copy Markdown
Owner

@ryaneggz ryaneggz commented Apr 4, 2026

Summary

  • OpenHarness CLI (cli/): new CLI built on Pi Agent SDK with subcommands for sandbox lifecycle management, replacing the root Makefile
  • @openharness/sandbox package (packages/sandbox/): reusable library with Docker orchestration tools, config management, and sandbox extensions
  • Dev container (.devcontainer/): Debian-based orchestrator container with Claude Code, Codex CLI, Docker, Node.js, Bun, uv, and GitHub CLI pre-installed
  • CI pipeline (.github/workflows/ci.yml): lint + test workflow for both packages with Husky pre-commit hooks
  • Workspace rebrand: .pi/.openharness/, updated banner and extension naming

Test plan

  • npm install and npm run build in cli/ and packages/sandbox/
  • npm test passes in both packages
  • docker compose -f .devcontainer/docker-compose.yml up -d --build starts cleanly
  • docker exec orchestrator claude --version and codex --version return versions
  • CI workflow passes on PR

🤖 Generated with Claude Code

ryaneggz and others added 30 commits March 6, 2026 14:00
Refactor setup script to remove 'clawdius' user references and adjust prompts for SSH keys and Git configuration. Update paths for Bun and uv installations to use the current user's home directory.
- Replace OpenClaw CLI (npm) with Claude Code CLI (curl installer)
- Rename ubuntu/ directory to sandbox/ for generic isolation env
- Remove MCP server files (index.js, package.json, entrypoint.sh, .example.env)
- Update all docs, links, and branch refs to Claude Code
- Simplify docker-compose (remove port mapping and env_file)
- Update CI workflow tag pattern to sandbox-*

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Move Dockerfile, .dockerignore, .gitignore to repo root
- sandbox/ now only contains setup.sh (files copied into container)
- Add COPY sandbox/ /sandbox/ to Dockerfile
- Update build contexts to root in docker-compose, Makefile, CI workflow
- Remove sandbox/README.md (consolidated into root README)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Create sandbox user with passwordless sudo in Dockerfile
- Install Bun, uv, Claude Code as sandbox user via su -
- System packages (Node.js, gh) remain root-level
- Git config, SSH keys, GH auth target sandbox user
- Fix PATH issues ($HOME instead of /home/$USER)
- Fix Claude Code install (pipe to bash, not sh)
- Replace clawdius references with sandbox

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Bind mount ./sandbox to /home/sandbox for persistence across restarts
- Copy sandbox files to /home/sandbox owned by sandbox user in Dockerfile
- Add make rebuild (no-cache build + restart)
- Rename SANDBOX_NAME default to claude

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…docs

- Move setup.sh to install/ (copied into image at build)
- Add workspace/ with CLAUDE.md (bind-mounted for persistence)
- Remove sandbox/ directory
- Install all tools system-wide as root (Bun, uv, Claude Code via npm)
- Bake --dangerously-skip-permissions alias into Dockerfile
- Mount only workspace/ to keep sandbox user home clean
- Update README with full setup docs, Makefile targets, architecture
- Update CLAUDE.md with agent-facing environment context

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- CI triggers on claude-v* tags (e.g. claude-v1.0.0)
- Images tagged as ghcr.io/ruska-ai/sandbox:claude-v1.0.0 + claude-latest
- Simplify Makefile IMAGE to ghcr.io/ruska-ai/sandbox:claude-$(TAG)
- Document release process in README

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Install tmux, nano, Docker CLI + Compose by default
- Add opt-in prompts for Codex, Pi Agent, and AgentMail CLI
- AgentMail API key stored in .bashrc (silent input, not in history)
- Create AGENTS.md as canonical instructions, symlink CLAUDE.md to it
- Add .claude/ and .codex/ config dirs in workspace
- Dockerfile: add codex/pi aliases, docker group for sandbox user
- docker-compose: mount Docker socket, add host.docker.internal
- Makefile: NAME variable for multiple named sandboxes (make NAME=foo run)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- CI workflow triggers on oh-v* tags, pushes to ghcr.io/ruska-ai/open-harness
- Makefile NAME defaults to open-harness
- README fully updated with open-harness branding, multi-agent docs, named sandboxes

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add entrypoint.sh that syncs the container's docker group GID to the
host socket's GID at startup, then drops to the sandbox user via gosu.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- DOCKER=false by default; pass DOCKER=true to mount socket + host networking
- Split compose into base and docker-compose.docker.yml override
- NAME is now required (no default) — errors clearly if missing
- shell/stop/clean print helpful messages when container not found

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds periodic heartbeat runner, agent persona (SOUL.md), and long-term
memory (MEMORY.md + daily logs) to give sandbox agents persistent
identity and recurring task execution.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…tion headers

- Add 'Why Open Harness?' section with 6 numbered core intentions
- Add Key Benefits table with emoji prefixes
- Add emoji to all section headers for visual clarity
- Add horizontal rules between major sections
- Add custom-banner-extension plan to .claude/plans
- Add 'make quickstart' target: builds image, starts container, provisions
  all tools non-interactively, prints next steps
- Move quickstart to top of README, before 'Why Open Harness?'
- Consolidate old Install/Docker Quick Start into 'More Ways to Run'
- Add quickstart to Makefile Targets table
Also moves .pi/ config into workspace/ and cleans up HEARTBEAT.md.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Ralph Agent and others added 29 commits April 8, 2026 21:12
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Fix archive path: .ralph/archive/ → .ralph/archives/YYYY-MM-DD/<feature>/
  (ralph.sh, implement SKILL.md, CLAUDE.md all aligned)
- US-FINAL now requires: dev server 200, public URL 200, archive verification
- Add git safety rules to .ralph/CLAUDE.md (never clone, never init)
- Fix tmux launch to use gosu sandbox (Claude refuses --dangerously-skip-permissions as root)
- Add validateArchivePath guard + 4 tests (39 total)
- Seed roadmap with 2 items (#4 health endpoint, #5 OG meta tags)
- Add @prisma/adapter-pg dependency
- Clean nested .git Ralph left in workspace/next-app/
- Harden .gitignore for src/generated/, repo-clone artifacts, .ralph/.claude/

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- TOOLS.md: .ralph/archive/ → .ralph/archives/
- implement/SKILL.md reference table: .ralph/archive/ → .ralph/archives/

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Regenerate package-lock.json to include @prisma/adapter-pg transitive deps
  (npm ci was failing: missing @emnapi/runtime, @emnapi/core)
- Reorder CI: Prisma generate + migrate BEFORE lint/type-check/build
  (type-check depends on generated Prisma client types)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Pre-commit now runs test:setup (8 stack health checks) after unit tests
- AGENTS.md rule #11: run /diagnose at end of every session
- Ralph pre-submit validation step 5: all 8 diagnose checks must pass

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
feat(#4): add /api/health endpoint for runtime monitoring
- Add jq to base apt-get install in Dockerfile (fixes notify_slack.sh hook)
- Archive completed feat/4-api-health Ralph run to .ralph/archives/
- ralph.sh: archive on completion + max-iteration exit, use mv instead of cp
- Sync next-env.d.ts and MEMORY.md with latest changes

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…data to root layout

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…-postgres-shadcn into agent/next-postgres-shadcn
CI was failing because auto-generated Prisma client files don't
conform to Prettier style. Added .prettierignore to skip src/generated/.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
src/generated/ is a build artifact from `prisma generate` — should not
be tracked. Also add config files (.prettierignore, .gitignore, .eslintrc*)
to CI path triggers so config changes are validated.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Move SSH key mounting from base compose into two mutually-exclusive
overlays (host mount vs generated keypair), add git worktree volume
overlay, broaden entrypoint ownership fix, and clear stale generated
Prisma client before regenerating.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
feat: reproducible Mom Slack bot integration
Prevents mom from silently skipping on container restart when Docker
Compose doesn't inject the tokens.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Prevent startup.sh from being committed — it sources runtime tokens
from environment variables and should not be version-controlled.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sync strategy:
- workspace/, .devcontainer/, install/, .github/, .claude/skills/ → ours (next-postgres-shadcn content)
- cli/, packages/, root package.json → theirs (latest open-harness SDK)
- Root AGENTS.md, README.md → theirs (orchestrator docs)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
sync: merge next-postgres-shadcn development into open-harness development
@ryaneggz ryaneggz merged commit 009ae75 into main Apr 11, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant